#!/bin/sh


if [ -n "$_VL_IMPORT_TOOLS" ] ; then
	return;
fi
_VL_IMPORT_TOOLS=0

######################################################
######################################################
# 内部工具方法
######################################################
######################################################

# 打印错误信息
# 参数 1 : 错误信息
function printError() {
	echo "\033[31m$1\033[0m"
}

# 打印警告文本
# 参数 1 : 警告消息
function printWarn() {
	echo "\033[33m$1\033[0m"
}

# 打印成功文本
# 参数 1 : 成功消息
function printSuccess() {
	echo "\033[32m$1\033[0m"
}

# 打印红色文本
# 参数 1 : 文本
function printRed() {
	echo "\033[31m$1\033[0m"
}

# 打印绿色文本
# 参数 1 : 文本
function printGreen() {
	echo "\033[32m$1\033[0m"
}

# 加载指定脚本
# 参数 1 : 脚本位置
# 
# 返回值 : 加载成功返回 0
function load() {
	if ! checkFile "$1" ; then
		printError "load \"$1\" failed"
		return 1
	fi

	if ! source "$1" ; then
		printError "load \"$1\" failed"
		return 1
	fi

	return 0
}

# 检查变量是否存在
# 参数 1 : 变量
#
# 返回值: 如果存在返回 0, 不存在返回 1
function checkVariable() {
	if [ -z "$1" ]; then
		return 1
	fi
	return 0
}

# 检查文件是否存在
# 参数 1 : 文件路径
#
# 返回值 : 如果存在返回 0, 不存在返回 1
function checkFile() {
	if checkVariable "$1"; then
		if [ -f "$1" ]; then
			return 0
		fi
	fi
	return 1
}

# 检查文件夹是否存在
# 参数 1 : 文件夹路径
#
# 返回值 : 如果存在返回 0, 不存在返回 1
function checkDir() {
	if checkVariable "$1"; then
		if [ -d "$1" ]; then
			return 0
		fi
	fi
	return 1
}

# 检查文件是否存在, 如果不存在则创建文件
# 参数 1 : 文件路径
#
# 返回值 : 如果成功返回 0, 不成功返回 1
function checkFileOrCreate() {
	if ! checkFile "$1" ; then
		if ! touch "$1" ; then
			return 1
		fi
	fi
	return 0
}

# 检查文件夹是否存在, 如果不存在则创建文件夹
# 参数 1 : 文件夹路径
#
# 返回值 : 如果成功返回 0, 不成功返回 1
function checkDirOrCreate() {
	if ! checkDir "$1" ; then
		if ! mkdir "$1" ; then
			return 1
		fi
	fi
	return 0
}

# 移除指定文件夹或文件
# 参数 1 : 文件 / 文件夹路径
#
# 返回值 : 删除成功返回 0
function removeFile() {
	if ! checkVariable "$1" ; then
		return 0
	fi
	if checkFile "$1" || checkDir "$1" ; then
		rm -rf "$1"
		return $?
	fi
	return 0
}

# 检查指令是否存在
# 参数 1 : 指令名
# 
# 返回值 : 存在指令返回 0
function checkCommandExist() {
	if ! checkVariable "$1" ; then
		return 1
	fi

	if ! command -v "$1" 2>&1 > /dev/null ; then
		return 1
	fi

	return 0
}

# 检查文件是否已过期
# 参数 1 : 时间戳文件
# 参数 2 : 比对文件
# 参数 3 : 如果存在表示只考虑过期情况, 文件不存在等情况按正常返回
# 
# 返回值 : 如果已过期或者不存在, 则返回 0
function checkFileExpire() {
	if ! checkFile "$1" ; then
		if ! checkVariable "$3" ; then
			return 0
		else
			return 1
		fi
	fi

	if ! checkFile "$2" ; then
		if ! checkVariable "$3" ; then
			return 0
		else
			return 1
		fi
	fi

	local fileTs=$(cat "$1")
	local fileCurrentTs=$(date -r "$2" +%s)

	if [[ "$fileTs" != "$fileCurrentTs" ]] ; then
		return 0
	fi

	return 1
}

# 将文件修改时间戳保存至指定文件中
# 参数 1 : 时间戳文件
# 参数 2 : 提供时间戳的文件
#
# 返回值 : 保存成功返回 0
function saveFileTs() {
	if ! checkFile "$2" ; then
		printError "save ts file failed : $2"
		return 1
	fi

	local fileCurrentTs=$(date -r "$2" +%s)
	if ! echo "$fileCurrentTs" > "$1" ; then
		printError "save ts file failed : $2"
		return 1
	fi
	return 0
}

# 设置变量
# 参数 1 : 变量名
# 参数 2 : 变量值
# 参数 3 : 添加模式
#         1    - 强制覆盖
#         2    - 追加
#         else - 如果存在则忽略
# 
# 返回值 : 如果复制成功返回 0, 否则返回 1
function defineVar() {
	VL_TEMP_VALUE=$(eval echo "\$$1")
	
	if ! checkVariable "$VL_TEMP_VALUE" ; then
		eval $1="\"$2\""
		return 0
	fi

	if checkVariable "$3" ; then
		if [ $3 -eq 1 ] ; then
			eval $1="\"$2\""
			return 0
		fi
		if [ $3 -eq 2 ] ; then
			eval $1="\"\$$1 $2\""
			return 0
		fi
	fi

	return 1
}

# 找到与指定文件不冲突的文件
# 参数 1 : 存放的变量名
# 参数 2 : 文件目录
# 参数 3 : 文件名
# 参数 4 : 文件后缀
function foundNotConflictFile() {
	local idx=0
	local path="$2/$3.$4"
	while (true)
	do
		if ! checkFile "$path" ; then
			eval $1="$path"
			return
		fi
		path="$2/$3${idx}.$4"
		let idx++
	done
}


# 从文件加载属性
# 
# 参数 1 : 文件名
# 参数 N : 属性名
#
# 返回值 : 如果文件不存在返回 1
function readProps() {
	if ! checkFile "$1" ; then
		return 1
	fi

	local arr=("$@")
	local count=${#arr[@]}
	

	let idx=1
	while ((idx<count))
	do
		# 置空
		eval ${arr[idx]}=
		let idx++
	done

	while read line
	do
		if [[ $line == \#* ]] || [[ "$line" == "" ]] ; then
			# 忽略注释
			continue
		fi

		local key=${line%%=*}
		local value=${line#*=}
		let idx=1
		while ((idx<count))
		do
			if [[ "${arr[idx]}" == "$key" ]] ; then
				if [[ "$value" == \"* ]] ; then
					eval ${arr[idx]}=$value
				else
					eval ${arr[idx]}="\"$value\""
				fi
				let idx=count
			else
				let idx++
			fi
		done

	done < "$1"
	return 0
}
